Completed
Push — master ( 2da778...5b5052 )
by EMP
12:05
created

main.js ➔ getCountryFlag   A

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
1
"use strict";
2
3
sodium.ready.then(function() {
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
4
5
const ae = new AllEars(function(ok) {
1 ignored issue
show
Bug introduced by
The variable AllEars seems to be never declared. If this is a global, consider adding a /** global: AllEars */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
6
	if (ok) {
7
		document.getElementById("txt_skey").style.background = "#404b41";
8
		document.getElementById("txt_skey").maxLength = "64";
9
	} else {
10
		console.log("Failed to load All-Ears");
11
	}
12
});
13
14
let tab="inbox";
15
let page=0;
16
17
// Helper functions
18
function getCountryName(countryCode) {
19
	const opts = document.getElementById("gatekeeper_country");
20
21
	for (let i = 0; i < opts.length; i++) {
22
		if (opts[i].value === countryCode) {
23
			return opts[i].textContent;
24
		}
25
	}
26
27
	return "Unknown countrycode: " + countryCode;
28
}
29
30
function getCountryFlag(countryCode) {
31
	const regionalIndicator1 = 127462 + countryCode.codePointAt(0) - 65;
32
	const regionalIndicator2 = 127462 + countryCode.codePointAt(1) - 65;
33
	return "&#" + regionalIndicator1 + ";&#" + regionalIndicator2 + ";";
34
}
35
36
function getMsgId(num) {
37
	let i;
38
	if (ae.GetExtMsgHeaders(num).toLowerCase().slice(0, 11) === "message-id:") {
39
		i = 0;
40
	} else {
41
		i = ae.GetExtMsgHeaders(num).toLowerCase().indexOf("\nmessage-id:");
42
		if (i < 1) return "ERR";
43
		i++;
44
	}
45
46
	const x = ae.GetExtMsgHeaders(num).slice(i + 11).trim();
47
	if (x[0] !== "<") return "ERR2";
48
	return x.slice(1, x.indexOf(">"));
49
}
50
51
function displayMsg(isInt, num) {
52
	document.getElementById("midright").scroll(0, 0);
53
54
	const ts = isInt? ae.GetIntMsgTime(num) : ae.GetExtMsgTime(num);
55
56
	document.getElementById("btn_reply").disabled = false;
57
	document.getElementById("btn_reply").onclick = function() {
58
		document.getElementById("write_recv").value = isInt? ae.GetIntMsgFrom(num) : ae.GetExtMsgFrom(num);
59
		document.getElementById("write_subj").value = "Re: " + (isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num));
60
		document.getElementById("write_rply").textContent = (isInt? "" : getMsgId(num));
61
		document.getElementById("btn_write").click();
62
		document.getElementById("div_write_1").hidden = false;
63
		document.getElementById("div_write_2").hidden = true;
64
		document.getElementById("write_body").focus();
65
		for (const opt of document.getElementById("write_from").options) {
66
			if (opt.value === (isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num))) {
67
				opt.selected = true;
68
			}
69
		}
70
	};
71
72
	document.getElementById("msg").hidden = false;
73
	document.getElementById("msg").getElementsByTagName("h1")[0].textContent = isInt ? ae.GetIntMsgTitle(num) : ae.GetExtMsgTitle(num);
74
	document.getElementById("msg").getElementsByTagName("pre")[0].textContent = isInt ? ae.GetIntMsgBody(num) : ae.GetExtMsgBody(num);
75
76
	document.getElementById("readmsg_to").textContent = isInt ? ae.GetIntMsgTo(num) : ae.GetExtMsgTo(num);
77
	document.getElementById("readmsg_date").children[0].textContent = new Date(ts * 1000).toISOString().slice(0, 19).replace("T", " ");
78
79
	if (!isInt) {
80
		document.getElementById("readmsg_ip").hidden = false;
81
		document.getElementById("readmsg_flags").hidden = false;
82
		document.getElementById("readmsg_country").hidden = false;
83
		document.getElementById("readmsg_tls").hidden = false;
84
		document.getElementById("readmsg_greet").hidden = false;
85
		document.getElementById("readmsg_timing").hidden = false;
86
		document.getElementById("readmsg_envfrom").hidden = false;
87
88
		const cc = ae.GetExtMsgCountry(num);
89
90
		document.getElementById("readmsg_ip").children[0].textContent = ae.GetExtMsgIp(num);
91
		document.getElementById("readmsg_country").innerHTML = getCountryFlag(cc) + " " + getCountryName(cc);
92
		document.getElementById("readmsg_tls").children[0].textContent = ae.GetExtMsgTLS(num);
93
		document.getElementById("readmsg_greet").children[0].textContent = ae.GetExtMsgGreet(num);
94
		document.getElementById("readmsg_envfrom").textContent = ae.GetExtMsgFrom(num);
95
96
		let flagText = "";
97
		if (!ae.GetExtMsgFlagPExt(num)) flagText += "<abbr title=\"The sender did not use the Extended (ESMTP) protocol\">SMTP</abbr> ";
98
		if (!ae.GetExtMsgFlagQuit(num)) flagText += "<abbr title=\"The sender did not issue the required QUIT command\">QUIT</abbr> ";
99
		if (ae.GetExtMsgFlagRare(num)) flagText += "<abbr title=\"The sender issued unusual command(s)\">RARE</abbr> ";
100
		if (ae.GetExtMsgFlagFail(num)) flagText += "<abbr title=\"The sender issued invalid command(s)\">FAIL</abbr> ";
101
		if (ae.GetExtMsgFlagPErr(num)) flagText += "<abbr title=\"The sender violated the protocol\">PROT</abbr> ";
102
		document.getElementById("readmsg_flags").children[0].innerHTML = flagText.trim();
103
	} else {
104
		document.getElementById("readmsg_ip").hidden = true;
105
		document.getElementById("readmsg_flags").hidden = true;
106
		document.getElementById("readmsg_country").hidden = true;
107
		document.getElementById("readmsg_tls").hidden = true;
108
		document.getElementById("readmsg_greet").hidden = true;
109
		document.getElementById("readmsg_timing").hidden = true;
110
		document.getElementById("readmsg_envfrom").hidden = true;
111
112
		let symbol = "<span title=\"Invalid level\">&#x26a0;</span>";
113
		if (ae.GetIntMsgFrom(num) === "system") {if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"System\">&#x1f162;</span>";} // S (System)
114
		else if (ae.GetIntMsgLevel(num) === 0) symbol = "<span title=\"Level 0 User\">&#x1f10c;</span>"; // 0
115
		else if (ae.GetIntMsgLevel(num) === 1) symbol = "<span title=\"Level 1 User\">&#x278a;</span>"; // 1
116
		else if (ae.GetIntMsgLevel(num) === 2) symbol = "<span title=\"Level 2 User\">&#x278b;</span>"; // 2
117
		else if (ae.GetIntMsgLevel(num) === 3) symbol = "<span title=\"Administrator\">&#x1f150;</span>"; // A (Admin)
118
119
		document.getElementById("readmsg_from").innerHTML = symbol + " " + ae.GetIntMsgFrom(num);
120
	}
121
}
122
123
// Interface
124
function addMsg(isInt, i) {
125
	const inbox = document.getElementById("tbl_inbox");
126
	const sent = document.getElementById("tbl_sent");
127
128
	const isSent = false; //TODO
129
	const table = isSent ? sent : inbox;
130
131
	const row = table.insertRow(-1);
132
	const cellTime = row.insertCell(-1);
133
	const cellSubj = row.insertCell(-1);
134
	const cellSnd1 = row.insertCell(-1);
135
	const cellSnd2 = row.insertCell(-1);
136
137
	const ts = isInt? ae.GetIntMsgTime(i) : ae.GetExtMsgTime(i);
138
	cellTime.setAttribute("data-ts", ts);
139
	cellTime.textContent = new Date(ts * 1000).toISOString().slice(0, 10);
140
141
	cellSubj.textContent = isInt? ae.GetIntMsgTitle(i) : ae.GetExtMsgTitle(i);
142
143
	if (isInt) {
144
		cellSnd1.textContent = ae.GetIntMsgFrom(i);
145
		cellSnd1.className = (ae.GetIntMsgFrom(i).length === 16) ? "mono" : "";
146
	} else {
147
		const from1 = ae.GetExtMsgFrom(i);
148
		const from2 = from1.substring(from1.indexOf("@") + 1);
149
		const cc = ae.GetExtMsgCountry(i);
150
151
		cellSnd1.textContent = from1.substring(0, from1.indexOf("@"));
152
		cellSnd2.innerHTML = "<abbr title=\"" + getCountryName(cc) + "\">" + getCountryFlag(cc) + "</abbr>";
153
154
		const fromText = document.createElement("span");
155
		fromText.textContent = " " + from2;
156
		cellSnd2.appendChild(fromText);
157
	}
158
159
//	divDel.innerHTML = "<input class=\"delMsg\" type=\"checkbox\" data-id=\"" + ae.GetIntMsgIdHex(i) + "\">";
160
161
	row.onclick = function() {
162
		displayMsg(isInt, i);
163
	};
164
/*
165
	cellDel.children[0].onchange = function() {
166
		if (!divDel.children[0].checked) {
167
			const checkboxes = elmt.getElementsByTagName("input");
168
			let checked = false;
169
170
			for (let j = 0; j < checkboxes.length; j++) {
171
				if (checkboxes[j].checked) {
172
					checked = true;
173
					break;
174
				}
175
			}
176
177
			if (!checked) {
178
				document.getElementById(isSent ? "btn_sentdel" : "btn_msgdel").hidden = true;
179
				return;
180
			}
181
		}
182
183
		document.getElementById(isSent? "btn_sentdel" : "btn_msgdel").hidden = false;
184
	};
185
*/
186
}
187
188
function addMessages() {
189
	const tbl = document.getElementById("tbl_inbox");
190
	tbl.innerHTML = "";
191
	const row = tbl.insertRow(-1);
192
	const cell = row.insertCell(-1);
193
	cell.textContent = "0";
194
195
	const rowsPerPage = Math.floor(getComputedStyle(document.querySelector("#div_inbox")).height.replace("px", "") / getComputedStyle(document.querySelector("#tbl_inbox > tbody > tr:first-child")).height.replace("px", "")) - 1; // -1 allows space for 'load more'
196
	if (typeof(rowsPerPage) !== "number") return;
197
	let skipMsgs = rowsPerPage * page;
198
199
	tbl.innerHTML = "";
200
201
	const maxExt = ae.GetExtMsgCount();
202
	const maxInt = ae.GetIntMsgCount();
203
204
	let numExt = 0;
205
	let numInt = 0;
206
	let numAdd = 0;
207
208
	while (numAdd < rowsPerPage) {
209
		const tsInt = (numInt < maxInt) ? ae.GetIntMsgTime(numInt) : 0;
210
		const tsExt = (numExt < maxExt) ? ae.GetExtMsgTime(numExt) : 0;
211
		if (tsInt === 0 && tsExt === 0) break;
212
213
		if (tsInt !== 0 && (tsExt === 0 || tsInt > tsExt)) {
214
			if (skipMsgs > 0) skipMsgs--; else {addMsg(true, numInt); numAdd++;}
215
			numInt++;
216
		} else if (tsExt !== 0) {
217
			if (skipMsgs > 0) skipMsgs--; else {addMsg(false, numExt); numAdd++;}
218
			numExt++;
219
		}
220
	}
221
222
	if (ae.GetReadyMsgKilos() < ae.GetTotalMsgKilos()) {
223
		const inbox = document.getElementById("tbl_inbox");
224
		const row = inbox.insertRow(-1);
225
		const cell = row.insertCell(-1);
226
		cell.textContent = "Load more (" + (ae.GetTotalMsgKilos() - ae.GetReadyMsgKilos()) + " KiB left)";
227
228
		row.onclick = function() {
229
			this.onclick = "";
230
231
			ae.Message_Browse(false, function(successBrowse) {
232
				document.getElementById("tbl_inbox").style.opacity = 1;
233
234
				if (successBrowse) {
235
					addMessages();
236
				}
237
			});
238
		};
239
	}
240
241
	document.getElementById("btn_left").disabled = (page === 0);
242
	document.getElementById("btn_rght").disabled = ((rowsPerPage * page) + numAdd >= maxExt + maxInt);
243
}
244
245
function updateAddressCounts() {
246
	document.getElementById("limit_normal").textContent = (ae.GetAddressCountNormal() + "/" + ae.GetAddressLimitNormal(ae.GetUserLevel())).padStart(ae.GetAddressLimitNormal(ae.GetUserLevel()) > 9 ? 5 : 1);
247
	document.getElementById("limit_shield").textContent = (ae.GetAddressCountShield() + "/" + ae.GetAddressLimitShield(ae.GetUserLevel())).padStart(ae.GetAddressLimitShield(ae.GetUserLevel()) > 9 ? 5 : 1);
248
	document.getElementById("limit_total").textContent = ((ae.GetAddressCountNormal() + ae.GetAddressCountShield()) + "/" + ae.GetAddrPerUser()).padStart(5);
249
}
250
251
function reloadInterface() {
252
	document.getElementById("div_begin").hidden = true;
253
	document.getElementById("div_main").style.display = "grid";
254
255
	// Contacts
256
	for (let i = 0; i < ae.GetContactCount(); i++) {
257
		addContact(
258
			ae.GetContactMail(i),
259
			ae.GetContactName(i),
260
			ae.GetContactNote(i)
261
		);
262
	}
263
264
	// Addresses
265
	for (let i = 0; i < ae.GetAddressCount(); i++) {
266
		addAddress(i);
267
	}
268
269
	document.getElementById("table_addrs").getElementsByTagName("caption")[0].textContent = "Level " + ae.GetUserLevel() + " User";
270
	updateAddressCounts();
271
}
272
273 View Code Duplication
function deleteAddress(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
274
	let btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
275
	for (let i = 0; i < btns.length; i++) btns[i].disabled = true;
276
277
	let addressToDelete = -1;
278
279
	for (let i = 0; i < ae.GetAddressCount(); i++) {
280
		if (addr === ae.GetAddress(i)) {
281
			addressToDelete = i;
282
			break;
283
		}
284
	}
285
286
	if (addressToDelete === -1) return;
287
288
	ae.Address_Delete(addressToDelete, function(success) {
289
		if (success) {
290
			document.getElementById("tbl_addrs").deleteRow(addressToDelete);
291
			document.getElementById("write_from").remove(addressToDelete);
292
			updateAddressCounts();
293
294
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) document.getElementById("btn_address_create_normal").disabled = false;
295
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) document.getElementById("btn_address_create_shield").disabled = false;
296
297
			ae.Private_Update(function(success2) {
298
				if (!success2) console.log("Failed to update the Private field");
299
300
				btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
301
				for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
302
			});
303
		} else {
304
			console.log("Failed to delete address");
305
306
			btns = document.getElementById("tbl_addrs").getElementsByTagName("button");
307
			for (let i = 0; i < btns.length; i++) btns[i].disabled = false;
308
		}
309
	});
310
}
311
312 View Code Duplication
function shieldMix(addr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
313
	let newAddr = "";
314
315
	for (let i = 0; i < 16; i++) {
316
		switch (addr.charAt(i)) {
317
			case '1':
318
				newAddr += "1iIlL".charAt(Math.floor(Math.random() * 5));
319
				break;
320
			case '0':
321
				newAddr += "0oO".charAt(Math.floor(Math.random() * 3));
322
				break;
323
			case 'w':
324
				newAddr += "VvWw".charAt(Math.floor(Math.random() * 4));
325
				break;
326
			default:
327
				newAddr += (Math.random() > 0.5) ? addr.charAt(i) : addr.charAt(i).toUpperCase();
328
		}
329
	}
330
331
	return newAddr;
332
}
333
334
function addAddress(num) {
335
	const addrTable = document.getElementById("tbl_addrs");
336
	const row = addrTable.insertRow(-1);
337
	const cellAddr = row.insertCell(-1);
338
	const cellChk1 = row.insertCell(-1);
339
	const cellChk2 = row.insertCell(-1);
340
	const cellChk3 = row.insertCell(-1);
341
	const cellBtnD = row.insertCell(-1);
342
343
	cellAddr.textContent = ae.GetAddress(num);
344
	cellAddr.onclick = function() {
345
		if (cellAddr.textContent.length === 16)
346
			navigator.clipboard.writeText(shieldMix(cellAddr.textContent) + "@" + ae.GetDomain());
1 ignored issue
show
Bug introduced by
The variable navigator seems to be never declared. If this is a global, consider adding a /** global: navigator */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
347
		else
348
			navigator.clipboard.writeText(cellAddr.textContent + "@" + ae.GetDomain());
349
	};
350
351
	cellChk1.innerHTML = ae.GetAddressAccExt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
352
	cellChk2.innerHTML = ae.GetAddressAccInt(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
353
	cellChk3.innerHTML = ae.GetAddressUse_Gk(num) ? "<input type=\"checkbox\" checked=\"checked\">" : "<input type=\"checkbox\">";
354
355
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
356
	cellBtnD.onclick = function() {deleteAddress(cellAddr.textContent);};
357
358
	const opt = document.createElement("option");
359
	opt.value = cellAddr.textContent;
360
	opt.textContent = cellAddr.textContent + "@" + ae.GetDomain();
361
	document.getElementById("write_from").appendChild(opt);
362
}
363
364
document.getElementById("btn_updt").onclick = function() {
365
	const btn = this;
366
	btn.disabled = true;
367
	btn.blur();
368
369
	if (tab === "inbox") {
370
		document.getElementById("tbl_inbox").style.opacity = 0.5;
371
372
		ae.Message_Browse(true, function(successBrowse) {
373
			document.getElementById("tbl_inbox").style.opacity = 1;
374
375
			if (successBrowse) {
376
				addMessages();
377
				btn.disabled = false;
378
			} else {
379
				console.log("Failed to refresh");
380
				btn.disabled = false;
381
			}
382
		});
383
	}
384
};
385
386
function addContact(mail, name, note) {
387
	const tbl = document.getElementById("tbl_ctact");
388
	const row = tbl.insertRow(-1);
389
	const cellMail = row.insertCell(-1);
390
	const cellName = row.insertCell(-1);
391
	const cellNote = row.insertCell(-1);
392
	const cellBtnD = row.insertCell(-1);
393
394
	cellMail.textContent = mail;
395
	cellName.textContent = name;
396
	cellNote.textContent = note;
397
	cellBtnD.innerHTML = "<button type=\"button\">X</button>";
398
399
	cellMail.contentEditable = true;
400
	cellName.contentEditable = true;
401
	cellNote.contentEditable = true;
402
403
	cellBtnD.onclick = function() {row.remove();};
404
}
405
406
document.getElementById("btn_newcontact").onclick = function() {
407
	addContact("", "", "");
408
}
409
410
// Tabs
411
function setupButtons() {
412
	switch(tab) {
413
		case "inbox":
414
		case "snbox":
415
			document.getElementById("btn_dele").disabled = false;
416
			document.getElementById("btn_left").disabled = false; // depends
417
			document.getElementById("btn_cent").disabled = true;
418
			document.getElementById("btn_rght").disabled = false; // depends
419
			document.getElementById("btn_updt").disabled = false;
420
		break;
421
		case "write":
422
			document.getElementById("btn_dele").disabled = false; // depends
423
			document.getElementById("btn_left").disabled = false; // depends
424
			document.getElementById("btn_cent").disabled = true;
425
			document.getElementById("btn_rght").disabled = false;
426
			document.getElementById("btn_updt").disabled = true;
427
		break;
428
		case "notes":
429
			document.getElementById("btn_dele").disabled = true;
430
			document.getElementById("btn_left").disabled = false; // depends
431
			document.getElementById("btn_cent").disabled = true;
432
			document.getElementById("btn_rght").disabled = false; // depends
433
			document.getElementById("btn_updt").disabled = true; // depends
434
		break;
435
		case "prefs":
436
			document.getElementById("btn_dele").disabled = true;
437
			document.getElementById("btn_left").disabled = false; // depends
438
			document.getElementById("btn_cent").disabled = true;
439
			document.getElementById("btn_rght").disabled = false; // depends
440
			document.getElementById("btn_updt").disabled = true; // depends
441
		break;
442
	}
443
}
444
445
document.getElementById("btn_left").onclick = function() {
446
	switch (tab) {
447
		case "inbox":
448
			page--;
449
			addMessages();
450
		break;
451
		case "write":
452
			document.getElementById("div_write_1").hidden = false;
453
			document.getElementById("div_write_2").hidden = true;
454
			document.getElementById("write_body").focus();
455
		break;
456
	}
457
458
	this.blur();
459
};
460
461
document.getElementById("btn_rght").onclick = function() {
462
	switch (tab) {
463
		case "inbox":
464
			page++;
465
			addMessages();
466
		break;
467
		case "write":
468
			if (!document.getElementById("div_write_1").hidden) {
469
				ae.Address_Lookup(document.getElementById("write_recv").value, function(pk) {
470
					if (pk) {
471
						document.getElementById("div_write_1").hidden = true;
472
						document.getElementById("div_write_2").hidden = false;
473
474
						document.getElementById("write2_from").textContent = document.getElementById("write_from").value + "@" + ae.GetDomain();
475
						document.getElementById("write2_recv").textContent = document.getElementById("write_recv").value;
476
						document.getElementById("write2_pkey").textContent = sodium.to_hex(pk);
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
477
478
						document.getElementById("write2_subj").textContent = document.getElementById("write_subj").value;
479
						document.getElementById("write2_rply").textContent = document.getElementById("write_rply").textContent;
480
						document.getElementById("write2_body").textContent = document.getElementById("write_body").value;
481
					} else {
482
						console.log("Failed lookup");
483
					}
484
				});
485
			} else if (!document.getElementById("div_write_2").hidden) {
486
				const topk = (document.getElementById("write2_recv").textContent.indexOf("@") > 0) ? null : sodium.from_hex(document.getElementById("write2_pkey").textContent);
1 ignored issue
show
Bug introduced by
The variable sodium seems to be never declared. If this is a global, consider adding a /** global: sodium */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
487
				ae.Message_Create(document.getElementById("write_subj").value, document.getElementById("write_body").value, document.getElementById("write_from").value, document.getElementById("write_recv").value, document.getElementById("write_rply").textContent, topk, function(success) {
488
					if (success) {
489
						console.log("Sent ok");
490
					} else {
491
						console.log("Failed sending");
492
					}
493
				});
494
			}
495
		break;
496
	}
497
498
	this.blur();
499
};
500
501
for (const btn1 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
502
	btn1.onclick = function() {
503
		for (const btn2 of document.getElementById("main1").getElementsByClassName("top")[0].getElementsByTagName("button")) {
504
			const isMatch = (btn1 === btn2);
505
			btn2.disabled = isMatch;
506
			document.getElementById("div_" + btn2.id.slice(4)).hidden = !isMatch;
507
508
			if (isMatch) {
509
				tab = btn2.id.slice(4);
510
				setupButtons();
511
			}
512
		}
513
	};
514
};
515
516
function addressCreate(addr) {
517
	const btnN = document.getElementById("btn_address_create_normal");
518
	const btnS = document.getElementById("btn_address_create_shield");
519
	btnN.disabled = true;
520
	btnS.disabled = true;
521
522
	ae.Address_Create(addr, function(success1) {
523
		if (success1) {
524
			ae.Private_Update(function(success2) {
525
				addAddress(ae.GetAddressCount() - 1);
526
				if (addr !== "SHIELD") document.getElementById("txt_address_create_normal").value = "";
527
				updateAddressCounts();
528
529
				if (!success2) console.log("Failed to update the Private field");
530
531
				if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
532
				if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
533
			});
534
		} else {
535
			console.log("Failed to add address");
536
537
			if (ae.GetAddressCountNormal() < ae.GetAddressLimitNormal(ae.GetUserLevel())) btnN.disabled = false;
538
			if (ae.GetAddressCountShield() < ae.GetAddressLimitShield(ae.GetUserLevel())) btnS.disabled = false;
539
		}
540
	});
541
}
542
543
document.getElementById("btn_address_create_normal").onclick = function() {
544
	if (ae.GetAddressCountNormal() >= ae.GetAddressLimitNormal(ae.GetUserLevel())) return;
545
546
	const txtNewAddr = document.getElementById("txt_address_create_normal");
547
	if (!txtNewAddr.reportValidity()) return;
548
549
	addressCreate(txtNewAddr.value);
550
}
551
552
document.getElementById("btn_address_create_shield").onclick = function() {
553
	if (ae.GetAddressCountShield() >= ae.GetAddressLimitShield(ae.GetUserLevel())) return;
554
555
	addressCreate("SHIELD");
556
};
557
558
document.getElementById("txt_skey").onkeyup = function(event) {
559
	if (event.key === "Enter") {
560
		event.preventDefault();
561
		document.getElementById("btn_enter").click();
562
	}
563
};
564
565
document.getElementById("btn_enter").onclick = function() {
566
	const txtSkey = document.getElementById("txt_skey");
567
	if (!txtSkey.reportValidity()) return;
568
569
	const btn = this;
570
	btn.disabled = true;
571
	document.getElementById("txt_skey").style.background = "#111";
572
573
	ae.SetKeys(txtSkey.value, function(successSetKeys) {
574
		if (successSetKeys) {
575
			ae.Account_Browse(0, function(successBrowse) {
576
				if (successBrowse) {
577
					txtSkey.value = "";
578
					reloadInterface();
579
					document.getElementById("btn_updt").click();
580
				} else {
581
					console.log("Failed to enter");
582
					btn.disabled = false;
583
					document.getElementById("txt_skey").style.background = "#404b41";
584
					txtSkey.focus();
585
				}
586
			});
587
		} else {
588
			console.log("Invalid format for key");
589
			btn.disabled = false;
590
			document.getElementById("txt_skey").style.background = "#404b41";
591
			txtSkey.focus();
592
		}
593
	});
594
};
595
596
});
597